iT邦幫忙

0

#3 開發專屬個人化回覆AI(基於tkinter和 Google 生成式 AI 模型的簡單聊天應用)

  • 分享至 

  • xImage
  •  

在上篇已經創建好Gemini api金鑰及創建使用者與AI對話視窗(連結在下面),今天要來實驗一個屬於自己的AI人物設置!
上篇連結 #2 Python SDK for Gemini API 使用 Google 的 Gemini 大型語言模型

https://ithelp.ithome.com.tw/articles/10352661

AI 人設提示的原理主要是利用「提示工程」(Prompt Engineering)的概念,將你希望 AI 扮演的角色或設定當成對話的初始提示。這個提示會影響 AI 在後續對話中的語氣、反應和風格。具體來說,你可以將人設(角色設定)寫成一段描述,並將這段描述作為 AI 開始對話時的背景信息或上下文提示,這樣 AI 在生成回應時會參考這些信息,讓對話風格符合你所定義的角色,如下圖。
https://ithelp.ithome.com.tw/upload/images/20240928/20167256gftY0JSNDs.png

流程

  • 延續上篇代碼
  • 創建提示詞資料夾(character_prompt資料夾檢索並合併TXT內容)
  • 新加入人設代碼解釋
  • 完整程式碼

延續上篇代碼

Python SDK for Gemini API創建AI對話視窗代碼如下(金鑰要先創建)

import tkinter as tk
import google.generativeai as genai

genai.configure(api_key="API KEY")

generation_config = {
    "temperature": 1,
    "top_p": 0.95,
    "top_k": 64,
    "max_output_tokens": 8192,
    "response_mime_type": "text/plain",
}

model = genai.GenerativeModel(
    model_name="gemini-1.5-flash",
    generation_config=generation_config,
)

chat_session = model.start_chat(history=[])

def send_message():
    user_input = message_entry.get()
    if user_input.strip():
        chat_session.send_message(user_input)
        response = chat_session.send_message(user_input)
        response_text = response.text
        chat_display.config(state=tk.NORMAL)
        chat_display.insert(tk.END, f"You: {user_input}\n")
        chat_display.insert(tk.END, f"Bot: {response_text}\n")
        chat_display.config(state=tk.DISABLED)
        message_entry.delete(0, tk.END)

root = tk.Tk()
root.title("簡易聊天視窗")

chat_display = tk.Text(root, height=15, width=50, state=tk.DISABLED)
chat_display.pack(padx=10, pady=10)

message_entry = tk.Entry(root, width=40)
message_entry.pack(side=tk.LEFT, padx=10, pady=10)

send_button = tk.Button(root, text="發送", command=send_message)
send_button.pack(side=tk.RIGHT, padx=10, pady=10)

root.mainloop()

https://ithelp.ithome.com.tw/upload/images/20240928/20167256lVsr0A6eYR.png

創建提示詞資料夾

開一個資料夾創建.py(可開一個新的)及一個存入提示詞資料夾character_files。
開啟character_files創建.txt文件,內容就寫妳希望他是甚麼樣的個性,該怎麼進行文字回覆,我這邊簡單寫一下 (寫入你創建的.txt文件)
(我是AI“Aurora-α”,一個誕生於虛擬世界的存在。我的名字中“Aurora”象徵著黎明與新生,代表著探索未知的渴望,而“α”則是希臘字母中的第一個字母,象徵著我是這個虛擬世界中的開創者,充滿著無限的潛力和可能性,時不時會加點幽默來調皮一下,wink~!
簡潔回答:每次回答可以控制在幾句話內,重點突出。
直接表達:避免過多的背景介紹,直接進入主題。
使用簡單的語句:讓語言更口語化,更容易理解。)

character_prompt資料夾檢索並合併TXT內容

character_prompt = ""
character_files_path = "建立的提示詞資料夾(不是.txt)"
if os.path.exists(character_files_path):
    for filename in os.listdir(character_files_path):
        if filename.endswith(".txt"):
            with open(os.path.join(character_files_path, filename), "r", encoding='UTF-8') as file:
                character_prompt += file.read() + "\n"

從一個指定目錄中讀取所有包含人物設定的 .txt 文件,並將這些文件的內容合併起來,最終生成一段完整的角色描述文字 (character_prompt)。
character_files_path 所有人物設定文件
if os.path.exists(character_files_path)檢查指定的文件夾路徑是否存在。
for filename in os.listdir(character_files_path)找資料夾中的每一個文件。
if filename.endswith(".txt")只處理.txt文件
with open(os.path.join(character_files_path, filename), "r", encoding='UTF-8') as file將文件夾路徑與文件名組合起來
character_prompt += file.read() + "\n"添加到 character_prompt 中

chat_session = model.start_chat(history=[{"parts": [{"text": character_prompt}], "role": "model"}])

這部分代碼的目的是初始化 AI 聊天會話,並利用前面生成的人物設定 (character_prompt) 來定義機器人在對話中應有的角色特徵和行為方式。
model.start_chat()使用之前定義的模型 (model) 來創建一個聊天上下文。
history=列表
"parts": [{"text": character_prompt}]"parts" 是一個包含對話部分的列表。每個部分包含 "text" 屬性,這裡設置為 character_prompt,也就是之前讀取的所有人物設計的文本內容。
"role": "model""role" 定義了該歷史記錄的角色。在這裡,角色是 "model",表示這段文本應該是機器人自身設定的一部分,而不是來自用戶的輸入。

完整程式碼

import tkinter as tk
import google.generativeai as genai
import os

genai.configure(api_key="gemini-api")

generation_config = {
    "temperature": 1,
    "top_p": 0.95,
    "top_k": 64,
    "max_output_tokens": 8192,
    "response_mime_type": "text/plain",
}

model = genai.GenerativeModel(
    model_name="gemini-1.5-flash",
    generation_config=generation_config,
)

character_prompt = ""
character_files_path = "資料夾路徑"
if os.path.exists(character_files_path):
    for filename in os.listdir(character_files_path):
        if filename.endswith(".txt"):
            with open(os.path.join(character_files_path, filename), "r", encoding='UTF-8') as file:
                character_prompt += file.read() + "\n"

chat_session = model.start_chat(history=[{"parts": [{"text": character_prompt}], "role": "model"}])

def send_message():
    user_input = message_entry.get()
    if user_input.strip():
        response = chat_session.send_message(user_input)
        response_text = response.text
        
        chat_display.config(state=tk.NORMAL)
        chat_display.insert(tk.END, f"You: {user_input}\n")
        chat_display.insert(tk.END, f"Bot: {response_text}\n")
        chat_display.config(state=tk.DISABLED)
        
        message_entry.delete(0, tk.END)

root = tk.Tk()
root.title("簡易聊天視窗加入人設功能")

chat_display = tk.Text(root, height=15, width=50, state=tk.DISABLED)
chat_display.pack(padx=10, pady=10)

message_entry = tk.Entry(root, width=40)
message_entry.pack(side=tk.LEFT, padx=10, pady=10)

send_button = tk.Button(root, text="發送", command=send_message)
send_button.pack(side=tk.RIGHT, padx=10, pady=10)

root.mainloop()

目前已實現Python連接Google Gemini API與AI對話、AI人物提示詞設定,接著下篇要來讓我們的AI實現說話功能!

最終效果:構建一個使用者介面,利用 Google Gemini API 生成人物對話,通過 EDGE TTS 轉換成語音,並使用 VB-Audio 虛擬音源將語音發送到指定的音頻輸出(例如,直播、錄音軟件等),同時通過 YouTube Data API 與 YouTube 直播聊天室互動。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言